// 让对象的每个属性都可以被监测
export class Observer {
    constructor(value) {
        this.value = value
        if (Array.isArray(value)) {
            // 数组的逻辑
        } else {
            // 对象的处理逻辑
            this.walk(value)
        }
    }

    walk(obj) {
        const keys = Object.keys(obj);
        for (let i = 0; i < keys.length; i++) {
            defineReactive(obj, keys[i]);
        }
    }
}

function defineReactive(obj, key, val) {
    // 减少一个变量
    if (arguments.length == 2) {
        val = obj[key]; // 当前的值
    }

    // 如果是个对象，要递归进去
    if (typeof val === 'object') {
        new Observer(val)
    }

    Object.defineProperty(obj, key, {
        get() {
            console.log(`${key}属性被读取了，值是：${val}`);
            return val
        },
        set(newVal){
            if (val === newVal) {
                return
            }
            val = newVal;
            console.log(`${key}属性被修改了，值是：${newVal}`);
        }
    }) 
}